In [1]:
import json
from datetime import datetime
import pandas as pd
import plotly.graph_objects as go
In [2]:
def loadjson(fn):
    f = open(fn)
    buf = f.read()
    f.close()
    
    obj = json.loads(buf)
    return obj

def showLine(name, x, y):
    fig = go.Figure()
    fig.add_trace(go.Scatter(x=x, y=y,
                        mode='lines',
                        name=name))

    fig.show()
    
def funcGetX(e):
  return e['x']    
    
def showLineWithMap(name, obj, mode = 'lines'):
    fig = go.Figure()
    
    arr = []
    x = []
    y = []
    for k in obj:
        arr.append({'x': k, 'y': obj[k]})
    
    arr.sort(key=funcGetX)
    
    for k in range(len(arr)):
        x.append(str(arr[k]['x']))
        y.append(arr[k]['y'])
    
    fig.add_trace(go.Scatter(x=x, y=y,
                        mode=mode,#'markers',
                        name=name))

    fig.show()
    
def showLineWithMap2(name, obj, yname, colorname, mode = 'lines'):
    fig = go.Figure()
    
    arr = []
    x = []
    y = []
    color = []
    for k in obj:
        arr.append({'x': k, 'y': obj[k][yname], 'color': obj[k][colorname]})
    
    arr.sort(key=funcGetX)
    
    for k in range(len(arr)):
        x.append(str(arr[k]['x']))
        y.append(arr[k]['y'])
        color.append(arr[k]['color'])        
    
    fig.add_trace(go.Scatter(x=x, y=y,
                        mode=mode,#'markers',
                        name=name,
                        marker=dict(
                            size=2,
                            color=color,#np.random.randn(500), #set color equal to a variable
                            colorscale='bluered', # one of plotly colorscales
                            showscale=True
                        )))

    fig.show()    
    
def showLinesWithMap(title, names, objs, mode = 'lines', xname='', yname=''):
    fig = go.Figure()
    
    for i in range(len(objs)):
        name = names[i]
        obj = objs[i]
        
        arr = []
        x = []
        y = []
        for k in obj:
            arr.append({'x': k, 'y': obj[k]})

        arr.sort(key=funcGetX)

        for k in range(len(arr)):
            x.append(arr[k]['x'])
            y.append(arr[k]['y'])

        fig.add_trace(go.Scatter(x=x, y=y,
                            mode=mode,#'markers',
                            name=name))
        
    fig.update_layout(title=title)    
    fig.update_xaxes(title_text=xname)
    fig.update_yaxes(title_text=yname)    

    fig.show()        
In [3]:
# 分析nodes
def analyzeNodes(obj):
    if obj['nodes'] is None:
        return {}
    
    mapNums = {}
    
    for i in range(len(obj['nodes'])):
        curobj = obj['nodes'][i]
        k = curobj['totalVal']
        mapNums[k] = len(curobj['lstHP'])    
    
    return mapNums

# 根据战斗结果筛选数值匹配的怪物属性配置,这里主要得到不同结果下的怪物数量
def analyzeEnemyNums(obj):        
    lstnames = ['total']
    lstmaps = [analyzeNodes(obj)]        
    
    for i in range(len(obj['detailNodes'])):
        if obj['detailNodes'][i]['nodes'] is not None:
            if obj['detailNodes'][i]['minTurns'] > 0 and obj['detailNodes'][i]['maxTurns'] > 0 and obj['detailNodes'][i]['minLastHP'] > 0 and obj['detailNodes'][i]['maxLastHP'] > 0:
                lstnames.append('turn [{}, {}) lasthp [{}, {})'.format(
                    obj['detailNodes'][i]['minTurns'],
                    obj['detailNodes'][i]['maxTurns'],
                    obj['detailNodes'][i]['minLastHP'],
                    obj['detailNodes'][i]['maxLastHP']))
            elif obj['detailNodes'][i]['minTurns'] > 0 and obj['detailNodes'][i]['maxTurns'] > 0:
                lstnames.append('turn [{}, {})'.format(
                    obj['detailNodes'][i]['minTurns'],
                    obj['detailNodes'][i]['maxTurns']))
            else:
                lstnames.append('lasthp [{}, {})'.format(
                    obj['detailNodes'][i]['minLastHP'],
                    obj['detailNodes'][i]['maxLastHP']))                

            lstmaps.append(analyzeNodes(obj['detailNodes'][i]))
            
    return lstnames, lstmaps
In [4]:
report = loadjson('./genenemy3.json')
lstnames, lstmaps = analyzeEnemyNums(report)
showLinesWithMap('均衡怪物各属性数量分布', lstnames, lstmaps, xname='总属性', yname='数量')
In [5]:
report = loadjson('./genenemy3hp.json')
lstnames, lstmaps = analyzeEnemyNums(report)
showLinesWithMap('偏肉的怪物各属性数量分布', lstnames, lstmaps, xname='总属性', yname='数量')
In [6]:
report = loadjson('./genenemy3dps.json')
lstnames, lstmaps = analyzeEnemyNums(report)
showLinesWithMap('偏输出的怪物各属性数量分布', lstnames, lstmaps, xname='总属性', yname='数量')
In [7]:
report = loadjson('./genenemy3moredps.json')
lstnames, lstmaps = analyzeEnemyNums(report)
showLinesWithMap('极致输出的怪物各属性数量分布', lstnames, lstmaps, xname='总属性', yname='数量')
In [8]:
report = loadjson('./genenemy3morehp.json')
lstnames, lstmaps = analyzeEnemyNums(report)
showLinesWithMap('极致肉的怪物各属性数量分布', lstnames, lstmaps, xname='总属性', yname='数量')